Since a function cannot alter the value of a variable which is passed as an argument, it may appear that the only way for a function to communicate with its calling function is via the return value. Another way of establishing communication between functions is through global variables (variables with file scope). However, the use of global variables can cause code to be difficult to debug and maintain.
A technique commonly used in C programs is to declare a formal parameter of the function to be a pointer variable*. The calling program passes the address of a variable (using the '&' operator) as an argument to the function. The called function may assign a new value to the variable "pointed to" by its pointer parameter, thus altering the value of a variable in the calling function.
In effect, the block scope of the calling function's variable is subverted by making the variable accessible from within another function's body. However, this is considered less problematic than the use of global variables since the scope boundaries remain well-defined.